package service;

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


public abstract class Gestionnaire_Fichier {
	/**
	 * Renvoie une liste de Fichier a partir d'un repertoire.
	 * @param chemin Le repertoire a parcourir.
	 * @return La liste des Fichier.
	 */
	public static List<Fichier_Avec_Chemin> enregistrerFichiers(String chemin) {
		ArrayList<Fichier_Avec_Chemin> fichiers = new ArrayList<Fichier_Avec_Chemin>();
		File repertoire = new File(chemin);
		
		if(!repertoire.exists()) {
			System.out.println("Le fichier/repertoire '" + chemin + "' n'existe pas.");
		}
		else if(!repertoire.isDirectory()) {
			System.out.println("Le chemin '" + chemin + "' correspond a un fichier et non a un repertoire.");
		}
		else {
			File[] files = repertoire.listFiles();
			for(int i = 0; i < files.length; i++) {
				if(files[i].isDirectory()) {
					fichiers.addAll(enregistrerFichiers(files[i].getAbsolutePath()));
				}
				else {
					getMd5(files[i].getAbsolutePath());
				}
			}
		}
		
		return fichiers;
	}
	
	/**
	 * Liste les fichiers d'un dossier et de ses sous-dossiers.
	 * @param chemin Le repertoire a parcourir.
	 */
	/*public static void listerFichiers(String chemin) {
		File repertoire = new File(chemin);
		
		if(!repertoire.exists()) {
			System.out.println("Le fichier/repertoire '" + chemin + "' n'existe pas.");
		}
		else if(!repertoire.isDirectory()) {
			System.out.println("Le chemin '" + chemin + "' correspond a un fichier et non a un repertoire.");
		}
		else {
			File[] fichiers = repertoire.listFiles();
			
			for(int i = 0; i < fichiers.length; i++) {
				if(fichiers[i].isDirectory()) {
					listerFichiers(fichiers[i].getAbsolutePath());
				}
				else {
					System.out.println(fichiers[i].getAbsolutePath());
				}
			}
		}
	}*/
	
	/**
	 * Renvoie le MD5 d'un fichier.
	 * @param chemin Le fichier.
	 * @return Le MD5 du fichier.
	 */
	public static String getMd5(String chemin) {
		String md5 = null;
		File file = new File(chemin);
		
		if(!file.exists()) {
			System.out.println("Le fichier/repertoire '" + chemin + "' n'existe pas.");
		}
		else if(!file.isFile()) {
			System.out.println("'" + chemin + "' correspond a un repertoire et non a un fichier.");
		}
		else {
			/*try {
				MessageDigest md = MessageDigest.getInstance("MD5");
				DigestInputStream dis = new DigestInputStream(new FileInputStream(file), md);
				dis.on(true);
				while(dis.read() != -1) { }
				byte[] b = md.digest();
				md5 = getMd5String(b);
				//System.out.println(md5 + " " + chemin);
				dis.close();
			}
			catch(Exception e) {
				System.out.println(e.getMessage());
			}*/
			
			md5 = UUID.randomUUID().toString();
		}
		
		return md5;
	}
	
	/**
	 * Renvoie le MD5 d'un fichier.
	 * @param bytes Le fichier.
	 * @return Le MD5.
	 */
	private static String getMd5String(byte[] bytes) {
		StringBuilder sb = new StringBuilder(bytes.length * 2);
		
		for(byte b : bytes) {
            if(b <= 0x0F && b >= 0x00) {
            	// On rajoute le 0 de poids fort ignore a la conversion.
                sb.append('0');
            }
			sb.append(String.format("%x", b));
		}
		
		return sb.toString();
	}
}
